package mediator

import "fmt"

var mediator *Mediator

type Mediator struct {
	ColA *ColleagueA
	ColB *ColleagueB
	ColC *ColleagueC
	//ColB []*ColleagueB// 也可能是其他形式的结构或集合
}

func GetMediatorInstance() *Mediator {
	if mediator == nil {
		return &Mediator{}
	}
	return mediator
}

func (m *Mediator) changed(colleague interface{}) {
	switch c := colleague.(type) {
	case *ColleagueA:
		m.ColB.AnyOperation(c.DataA)
		m.ColC.OtherOperation(c.DataA)
	case *ColleagueB:
		m.ColC.OtherOperation(c.DataB)
	}
}

// ColleagueA 同事类
type ColleagueA struct {
	DataA string
}

// SomeOperation 示意方法，执行某些业务功能
func (c *ColleagueA) SomeOperation(str string) {
	// 自己的业务功能...
	c.DataA = str + " colleagueA" + "-->"
	fmt.Println(c.DataA)
	// 在需要跟其他同事通信时，通知中介者对象
	med := GetMediatorInstance()
	med.changed(c)
}

type ColleagueB struct {
	DataB string
}

// AnyOperation 示意方法，执行某些业务功能
func (c *ColleagueB) AnyOperation(str string) {
	// 自己的业务功能
	c.DataB = str + " colleagueB" + "-->"
	fmt.Println(c.DataB)
	// 在需要跟其他同事通信时，通知中介者对象
	med := GetMediatorInstance()
	med.changed(c)
}

type ColleagueC struct {
	DataC string
}

// OtherOperation 示意方法，执行某些业务功能
func (c *ColleagueC) OtherOperation(str string) {
	// 自己的业务功能
	c.DataC = str + " colleagueC" + "--->"
	fmt.Println(c.DataC)
	// 在需要跟其他同事通信时，通知中介者对象
	med := GetMediatorInstance()
	med.changed(c)
}
